package com.bootdo.app.common.utils;


import com.bootdo.app.common.snowflake.IdWorker;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.UUID;

import static java.time.temporal.ChronoField.*;

public class IDGenerator {

    private static final DateTimeFormatter ID_FORMATTER = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.BASIC_ISO_DATE)
            .appendValue(HOUR_OF_DAY, 2)
            .appendValue(MINUTE_OF_HOUR, 2)
            .appendValue(SECOND_OF_MINUTE, 2)
            .appendFraction(NANO_OF_SECOND, 0, 9, false)
            .toFormatter();

    private static String[] chars = new String[] { "a", "b", "c", "d", "e", "f",
            "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
            "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",
            "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
            "W", "X", "Y", "Z" };

    private static int LEN = chars.length;


    /**
     * 生成唯一id（18位数字）
     * @return
     */
    public static Long getId(){
        return IdWorker.inctance().get();
    }

    /**
     * 生成 11 位 uuid
     * @return
     */
    public static String getShortUuid() {
        StringBuffer shortBuffer = new StringBuffer();
        // uuid.len = 32
        String uuid = UUID.randomUUID().toString().replace("-", "");
        for (int i = 0; i < 11; i++) {
            String str = uuid.substring(i * 3, i * 3 + 2);
            shortBuffer.append(chars[Integer.parseInt(str, 16) % LEN]);
        }
        return shortBuffer.toString();

    }

    /**
     * 根据当前日期时间生成包含特定字符的编号
     * @param specificStr
     * @return
     */
    public static String getSpecificNoOfNow(String specificStr){
        return specificStr + LocalDateTime.now().format(ID_FORMATTER);

    }

    public static void main(String[] args) {
        System.out.println(getId());
        System.out.println(getShortUuid());
        System.out.println(getSpecificNoOfNow("lx"));
    }


}
